package com.mlt.converter.encodings.fsst;

import java.util.Base64;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.SECONDS)
@BenchmarkMode(Mode.Throughput)
@Threads(value = 1)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(value = 1)
public class FsstBenchmark {

  private static final Fsst JAVA = new FsstJava();
  private static final Fsst JNI = new FsstJni();

  // ~30 bytes
  private static final byte[] SMALL =
      Base64.getDecoder().decode("SGV1YmFjaExpcHBlS2V0dGJhY2hTdGV2ZXI=");
  private static final SymbolTable SMALL_ENCODED = JAVA.encode(SMALL);
  // ~600 bytes
  private static final byte[] MEDIUM =
      Base64.getDecoder()
          .decode(
              "UsO8c3RlcmJlcmdFaXNlbmJlcmdLYXNzZWxlciBLdXBwZUJpbHN0ZWluVm9nZWxoZXJkTWlsc2VidXJnSG9oZSBHZWJhSGVsZHJhc3RlaW5PaG1iZXJnR3Jvw59lciBLbm9sbGVuU2Nod2VmZWxrb3BmR3Jvw59lciBCZWVyYmVyZ0FsdGVyIEJlcmcgKEhhaW5pY2gpUG9wcGVuYmVyZ0Jyb2NrZW5Sw7xja2Vyc2JpZWxHcm/Dn2VyIEthbG1iZXJnS8O8bnplbHNiZXJnSm9zZXBoc2jDtmhlV2VnZW5lcnNrb3BmUm/Dn2LDvGhsTcO2bmNoc2JlcmdXaW5ka25vbGxlbkVyYmJlcmdTdGVsbGJlcmdEb3JuYmVyZ0xvdGhyYWjDvGdlbEZlaHJlbmJlcmdBaGxzYnVyZ0hlaW5yaWNoc2jDtmhlV2V0dGVuYnVyZyAoSGFpbmxlaXRlKU3DvGhsZW5zdGVpblNjaG5lZWtvcGZBbGhlaW1lckdyb8OfZSBMYWl0ZVNvaXNiZXJnS2V1ZGVsc2t1cHBlRXNwaWdNYXVsa3VwcGVWaWt0b3JzaMO2aGVHcm/Dn2VyIEF1ZXJiZXJnSG9ja2VscmFpbkJvY2tHcm/Dn2VyIEV0dGVyc2JlcmdSaWVjaGhlaW1lciBCZXJnQnViZW5iYWRlciBTdGVpbldvbGZza29wZkJ1Y2hzY2hpcm1iZXJnU2F1aMO8Z2VsSGFuZ3N0ZWluSHV0c2JlcmdHZWllcnNow7xnZWxHZXJiZXJzdGVpblJvc3Nrb3BmV2lja2VuLUJlcmdCcmFha2JlcmdTY2htaWVkc3dpZXNlbmtvcGZCw7xobEdyb8OfZXIgRmluc3RlcmJlcmdHcm");
  private static final SymbolTable MEDIUM_ENCODED = JAVA.encode(MEDIUM);
  // ~23kb
  private static final byte[] LARGE =
      Base64.getDecoder()
          .decode(
              "THljw6llIGfDqW7DqXJhbCBldCB0ZWNobm9sb2dpcXVlIEhlbnJpIEJlcmdzb25Mb3VpcyBCbGFuY0dhcmUgZGUgbCdFc3RGb25kYXRpb24gb3BodGFsbW9sb2dpcXVlIEFkb2xwaGUgZGUgUm90aHNjaGlsZE1hcm9jQ2hhbXBpb25uZXRDZXNhcmlhIEV2b3JhIC0gUm9zYSBQYXJrc0NvbGzDqGdlIFNvbmlhIERlbGF1bmF5Q2VudHJlIG3DqWRpY2FsSMO0cGl0YWwgZGUgam91ciBMw6lvcG9sZCBCZWxsYW5JbnN0aXR1dCBMYXNlciBWaXNpb24gZGVzIEJ1dHRlcyBDaGF1bW9udENyaW3DqWVSb3NhIFBhcmtzTWFyY2FkZXQgLSBQb2lzc29ubmllcnNQbGFjZSBIw6liZXJ0SMO0cGl0YWwgZGUgam91ciBHZW9yZ2VzIFZhY29sYVBhcmMgQ2hhcGVsbGUtQ2hhcmJvblBvcnRlIGRlIGxhIENoYXBlbGxlT3B0aWNsYWlyQmFyYsOocyAtIFJvY2hlY2hvdWFydENow6J0ZWF1IFJvdWdlQ2jDonRlYXUgTGFuZG9uTWFyeCBEb3Jtb3lMZXMgQ2FyaWF0aWRlcyBkJ0FiYmV2aWxsZUjDtHBpdGFsIEZlcm5hbmQgV2lkYWxTdGFsaW5ncmFkQ2xpbmlxdWUgVsOpdMOpcmluYWlyZSBkdSBGYXVib3VyZ0xhIEJ1dHRlUmlxdWV0U2VjcsOpdGFuIC0gQnV0dGVzIENoYXVtb250VHJpc3RhbiBUemFyYUxlcyBSb3Nlc0N1c3RpbmUgLSBSYW1leVBham9sIC0gRMOpcGFydGVtZW50VsOpbGlnb0NyaW3DqWUgLSBDdXJpYWxNYXRlbGFzIEZhY3RvcnlDb2xsw6hnZSBIZW5yaSBCZXJnc29uR2FyZSBkdSBOb3JkIChNw6l0cm8pUm9zYSBQYXJrcyAtIEN1cmlhbEphdXLDqHPDiWNvbGUgcG9seXZhbGVudGUgZGVzIFBvaXNzb25uaWVyc0NvbG9uZWwgRmFiaWVuTG9uZyBDaGFuZ1BvbnQgTWFyY2FkZXRTaW1wbG9uTWFnZW50YSAtIE1hdWJldWdlIC0gR2FyZSBkdSBOb3JkR29sZCBHU01GbGFuZHJlQ2FuYWwgU2FpbnQtTWFydGluUG9pc3Nvbm5pw6hyZUdhcmUgZGUgbOKAmUVzdEV1Z8OobmUgU3VlUGFqb2wgLSBSaXF1ZXRQYXJ2aXMgUm9zYSBQYXJrc8OJdmFuZ2lsZSAtIEF1YmVydmlsbGllcnNBZnJpY2EgaW4gYSBCb3hTcXVhcmUgZHUgMjEgQXZyaWwgMTk0NEjDtHBpdGFsIExhcmlib2lzacOocmVCb2xpdmFyVHJvcGljb3NtZXRpcXVlTWF0aHVyaW4gTW9yZWF1IC0gU2ltb24gQm9saXZhckNoYXBlbGxlIC0gQ2FpbGxpw6lEZWxpY2UgS3lveWFNb25jZWF1IEZsZXVyc0xpYnJhaXJpZSBkZXMgT3JndWVzRG91ZGVhdXZpbGxlVmVyZHVuw4lnbGlzZSBOb3RyZS1EYW1lLWRlLWwnQXNzb21wdGlvbiBkZXMgQnV0dGVzLUNoYXVtb250QXRsYXNLaW5nIENvY2tQbGFjZSBkZSBUb3JjeVBham9sTWFnZW50YUFsYmVydCBLYWhuSmF1csOocyAtIFN0YWxpbmdyYWRQbGFjZSBGcmFueiBMaXN6dExhIEZheWV0dGUgLSBQb2lzc29ubmnDqHJlTGFiYXRBTUogQmF0aW1lbnRNYXJvYyAtIEZsYW5kcmVDb25kb3JjZXRJYmlzIE9ybmFub0NvY2NpTWFya2V0Q2FtYnJhaVnFjXNvUGhpbGlwcGUgZGUgR2lyYXJkT3JkZW5lciAtIE1hcnggRG9ybW95TWFnZW50YS1HYXJlIGRlIGwnRXN0Qm91Y3J5T3B0aWNhbFJ1ZSBkZSBNZWF1eExhIENoYXBlbGxlUm9jaGVjaG91YXJ0IC0gQ2xpZ25hbmNvdXJ0TGUgUGFpbiBkZSBsYSBMaWJlcnTDqUVzcGFjZSBTcG9ydGlmIFBhaWxsZXJvbkdhcmUgZHUgTm9yZCAoUkVSKU1hcmNow6kgU2VjcsOpdGFuRHIuIEdyYXZlc0NhcnJlZm91ciBDaXR5R3JhbmdlIGF1eCBCZWxsZXMgLSBKdWxpZXR0ZSBEb2R1U2FtYnJlIGV0IE1ldXNlTUlBTVBpc2NpbmUgUGFpbGxlcm9uQ3JpbcOpZSAtIEFyY2hlcmVhdUphZCBWb3lhZ2VzUGFyYWRpc1NreU5ldENlbnRyZSBJbnRlcnByb2Zlc3Npb25uZWwgZGUgRm9ybWF0aW9uIGRlcyBDb21tZXJjZXMgZGUgbCdBbGltZW50YXRpb25OYW5kdSBNaW5pIE1hcmtldFNxdWFyZSBNb250aG9sb25QYXJpcyBHYXJlIGR1IE5vcmTDiWNvbGUgbWF0ZXJuZWxsZSBkdSBEw6lwYXJ0ZW1lbnRTYWludC1CcnVub011bGxlckxlIENhZHJlIE5vaXJMYXZlcmllIE5ldCDDoCBTZWNSdWUgUmF5bW9uZCBRdWVuZWF1IChhc2NlbnNldXIpTGEgRmF5ZXR0ZSAtIER1bmtlcnF1ZU1hZ2VudGEgLSBNYXViZXVnZVJhZGlndWV0UGxhY2UgZHUgTWFyb2NMdW4nT3JBbmRyw6lDcsOoY2hlIENvbGxlY3RpdmVNYWRvdSBTYW5ndWluQ29uZG9yY2V0IC0gVHJ1ZGFpbmVQcm9ncmVzcyBTYW50w6lQbGFjZSBkZSBsYSBDaGFwZWxsZUdyb3VwZSBTY29sYWlyZVJlc3RhdXJhbnQgQmFsYWRpw4ljb2xlIE5vcm1hbGUgU29jaWFsZUTDqXBhcnRlbWVudCAtIE1hcnggRG9ybW95TWFyY2jDqSBTZWNyw6l0YW4gKDI2KVJvbmQtcG9pbnQgZGUgbGEgQ2hhcGVsbGVRdWFpIGRlIGxhIFNlaW5lIC0gU3RhbGluZ3JhZMOJY29sZSBNYXRlcm5lbGxlTS4gS2hhbiBNb2JpbGUgRmFzaGlvblRpbnRhbWFycmVWYWxlbmNpZW5uZXNaZW4mQ29Dcmltw6llIC0gQXViZXJ2aWxsaWVyc1BhcmlzIENvbGxlZ2Ugb2YgQXJ0Uml2b2xpIFJldG91Y2hlQ29sbMOoZ2UgR8OpcmFyZCBQaGlsaXBlQ29sbMOoZ2UgR2VvcmdlcyBDbGVtZW5jZWF1VUZSIGRlIE3DqWRlY2luZSBQYXJpcyBEaWRlcm90IC0gU2l0ZSBWaWxsZW1pbsOJY29sZSBtYXRlcm5lbGxlIGRlIFRvcmN5QXV4IETDqWxpY2VzIGQnQWJyYWhhbUN1cmlhbCAtIEFyY2hlcmVhdcOJY29sZSBtYXRlcm5lbGxlIFJpY2hvbW1lTGEgTWFpc29uIE1va3JhdFBhbGFpcyBkdSBXZW56aG91Q2Fyb2xlw4ljb2xlIFN1cMOpcmlldXJlIGRlIFZlbnRlIGV0IGQnRXhwb3J0YXRpb27DiWNvbGUgcHJpbWFpcmUgQ3Vnbm90Q3LDqGNoZSBCbGV1ZUNyaW3DqWUgLSBSb3NhIFBhcmtzQ29sbMOoZ2UgcHJpdsOpIFNhaW50LVZpbmNlbnRUZW5kYW5jZUNoZXogSGFtaWRMYSBDb2lmacOocmXDiWNvbGUgcHJpbWFpcmUgQ2hhbXBpb25uZXRDdXJpYWwgLSBDcmltw6llQ29sbMOoZ2UgUm9sYW5kIERvcmdlbMOoc0NGQSBJR1NMeWPDqWUgdGVjaG5vbG9naXF1ZSBKdWxlcyBTaWVnZnJpZWRMeWPDqWUgcHJvZmVzc2lvbm5lbCBFZG1vbmQgUm9zdGFuZMOJY29sZSDDqWzDqW1lbnRhaXJlIFBoaWxpcHBlIGRlIEdpcmFyZENhaWwgLSBEZW1hcnF1YXloYWx0ZSBuYXV0aXF1ZSBkZSBsYSBWaWxsZXR0ZUNhbmFsIDEzMU1haXNvbiBaaWx2ZWxpU3VubnnDiWNvbGUgw6lsw6ltZW50YWlyZSBwcml2w6llIFNhaW50ZS1NYXJpZVBhcnRlbmFpcmUgQ3LDqGNoZVByZXNzaW5nIFVuaS1QcmVzc0x5Y8OpZSBwcm9mZXNzaW9ubmVsIHByaXbDqSBNYXJjZWwgTGFteUNhbWHDr2V1Q3LDqGNoZSBjb2xsZWN0aXZlIERlbGVzc2VydENvbGzDqGdlIEFpbcOpIEPDqXNhaXJlw4ljb2xlIHByaW1haXJlIE1hdGhpc1N0ZWxsaWHDiWNvbGUgw6lsw6ltZW50YWlyZSBkZSBsYSBHdWFkZWxvdXBlR2FyZSBkdSBOb3JkTGEgY8WTdXIgZGVzIHBhaW5zQ29sbMOoZ2UgR2VvcmdlcyBNw6lsacOoc0NvbGzDqGdlIExhbWFydGluZURyYWdvbiBXb2tTcXVhcmUgU2ltcGxvbi1BbWlyYXV4w4ljb2xlIHByaW1haXJlIENsaW5nbmFuY291cnRTYWxsZSBkZSBtdXNjdWxhdGlvbiBQYWlsbGVyb27DiXRhYmxpc3NlbWVudCBzdXDDqXJpZXVyIHByaXbDqSBQcm9ncmVzcyBTYW50w6lTZWNvdXJzIHBvcHVsYWlyZSAtIEbDqWTDqXJhdGlvbiBkZSBQYXJpc0x5Y8OpZSBHw6luw6lyYWwgTGFtYXJ0aW5lw4ljb2xlIE1hdGVybmVsbGUgQm95LVplbGluc2tpw4ljb2xlIMOpbMOpbWVudGFpcmUgZGUgVG9yY3lNYWdlbnRhIC0gTWF1YmV1Z2Ug4oCTIEdhcmUgZHUgTm9yZEJvIEJ1blN1cCBjYXJlZXJMYSBQaWNjb2xhIFNpY2lsaWFJTlNFRUMgU2Nob29sIG9mIEJ1c2luZXNzICYgRWNvbm9taWNzQ0ZBIFN0ZXBoZW5zb27DiWNvbGUgUG9seXZhbGVudGUgUGFqb2xKYXJkaW4gZHUgMTIyIHJ1ZSBkZXMgUG9pc3Nvbm5pZXJzU0hSb2Nyb3kgU2FpbnQtVmluY2VudC1kZS1QYXVsUmVsYWlzIExhIFBvc3RlQ2Fpc3NlIG5hdGlvbmFsZSBkJ2Fzc3VyYW5jZSB2aWVpbGxlc3NlTGEgQ3Jpw6llUGF0aW5vaXJlIFBhaWxsZXJvbkNlbnRyZSBJbnRlciBFbnRyZXByaXNlIGRlIEZvcm1hdGlvbiBlbiBBbHRlcm5hbmNlw4ljb2xlIHBvbHl2YWxlbnRlIGRlIGxhIEdvdXR0ZSBkJ09ySmFyZGlucyBSb3NhIEx1eGVtYnVyZ0Nvb2snbiBXaXRoIENsYXNzIFBhcmlzw4ljb2xlIG1hdGVybmVsbGUgVGNoYcOva292c2tpTWF0aGlzQ29sbMOoZ2UgcHJpdsOpIEx1Y2llbiBkZSBIaXJzY2hNYWlzb24gZGVzIEFzc29jaWF0aW9uc1JvdG9uZGUgZGUgbGEgVmlsbGV0dGVTdXAgZGUgcHViQ3LDqGNoZSBjb2xsZWN0aXZlR3Jlc3NldMOJY29sZSBtYXRlcm5lbGxlIFNpbW9uIEJvbGl2YXJDb3VycyBGbG9yZW50w4ljb2xlIFNlY29uZCBEZWdyw6kgUHJvZi4gUHJpdsOpZSBTYWludC1Mb3VpcyBVbmlvbiBBY2Fkw6ltaWVWaWxsYSBkZSBDaGluZUx5Y8OpZSBwcm9mZXNzaW9ubmVsIEd1c3RhdmUgRmVycmnDqXBpenphTGVzIEphcmRpbnMgZCfDiW9sZcOJY29sZSDDqWzDqW1lbnRhaXJlIENhdsOpUGljYXJkQ29sbMOoZ2UgRGFuaWVsIE1heWVyw4ljb2xlIHBvbHl2YWxlbnRlIFNpbXBsb25HaWJlcnQgSm9zZXBoIC0gUGFyaXMgWFZJSUnDiWNvbGUgbWF0ZXJuZWxsZSBHb3V0dGUgZCdPck5KRGlhbW9uZCBIYWlyQ29sbMOoZ2UgQ2hhcmxlcyBQw6lndXlIYXV0LVBhcmxldXJzIFN5c3TDqG1lc8OJY29sZSBtYXRlcm5lbGxlIEFtaXJhdXhCVFMgSGVucmkgQmVyZ3NvbkNoYXVkcm9uIC0gU2FpbnQtTWFydGluTGUgY2FkcmUgbm9pcsOJY29sZSDDqWzDqW1lbnRhaXJlIE1hdXJpY2UgR2VuZXZvaXjDiWNvbGUgw6lsw6ltZW50YWlyZSBkJ09yYW5TcXVhcmUgRnJhbsOnb2lzZS1Iw6lsw6huZSBKb3VyZGHDiWNvbGUgbWF0ZXJuZWxsZSDDiWNsdXNlcyBTYWludC1NYXJ0aW5DcsOoY2hlIGNvbGxlY3RpdmUgbXVuaWNpcGFsZSBkZSBSb3VlbkxlIHBpZWQgw6AgdGVycmVIb2xpZGF5IElubiBFeHByZXNzIDogSMO0dGVsIFBhcmlzLUNhbmFsIERlIExhIFZpbGxldHRlTGEgRmF5ZXR0ZSAtIE1hZ2VudGFDYW1wdXMgbGFuZ3Vlc8OJY29sZSBldCBDb2xsw6hnZSBTYWludC1HZW9yZ2VzIChwcml2w6kpTHljw6llIHByb2Zlc3Npb25uZWwgU3V6YW5uZSBWYWxhZG9uSUNEIEludGVybmF0aW9uYWwgQnVzaW5lc3MgU2Nob29sw4ljb2xlIMOJbMOpbWVudGFpcmUgRG91ZGVhdXZpbGxlTGEgTWFybW90acOocmUgUMOpdHJlbGxlTHljw6llIGfDqW7DqXJhbCBldCB0ZWNobm9sb2dpcXVlIHByaXbDqSBDaGFybGVzIGRlIEZvdWNhdWxkUGxhbmV0IENoYW50aWVyUG9saWNlIE5hdGlvbmFsZcOJY29sZSDDqWzDqW1lbnRhaXJlIENsYXVkZSBWZWxsZWZhdXhDb2xsw6hnZSBMYSBHcmFuZ2UgYXV4IEJlbGxlc1NxdWFyZSBBcmlzdGlkZSBDYXZhaWxsw6ktQ29sbDEwOCBDYWbDqUxlIE1vdWxpbiBkZSBsYSBQYWxldHRlw4ljb2xlIHByaW1haXJlIGQnYXBwbGljYXRpb25CaWJsaW90aMOocXVlIFbDoWNsYXYgSGF2ZWxJbnN0aXR1dCBkZSBHZXN0aW9uIFNvY2lhbGUgLSDDiWNvbGUgZGVzIFJlc3NvdXJjZXMgSHVtYWluZXNMaWJyYWlyaWUgTm9yZGVzdMOJY29sZSDDqWzDqW1lbnRhaXJlIGRlIGwnw4l2YW5naWxlQ2VudHJlIEludGVyLUVudHJlcHJpc2VzIGRlIEZvcm1hdGlvbiBlbiBBbHRlcm5hbmNlw4ljb2xlIMOpbMOpbWVudGFpcmUgT3VyY3FMYSBEaW1lbnNpb24gRmFudGFzdGlxdWVMYSBSZW5haXNzYW5jZUNvdWRlcmPDiWNvbGUgw4lsw6ltZW50YWlyZSBTaW1vbiBCb2xpdmFyTm8gQ29tbWVudFBhcmlzIENow6J0ZWF1IFJvdWdlw4ljb2xlIG1hdGVybmVsbGUgU2FpbnQtTHVjw4ljb2xlIHByaW1haXJlIEHDiWNvbGUgTWF0ZXJuZWxsZSBBcmNoZXJlYXVHb29kIElkZWFzIGZvciBFdmVyeWRheSBMaWZlTGlicmFpcmllIEZsYW1iZXJnZUZyYW5wcml4U3F1YXJlIE1hcmMtU2VndWluQWxob3VkYcOJcGljZXJpZSBmbGV1cmllw4ljb2xlIMOpbMOpbWVudGFpcmUgRXVnw6huZSBWYXJsaW7DiWNvbGUgcHJpbWFpcmUgZCdhcHBsaWNhdGlvbiBCTHljw6llIHByb2Zlc3Npb25uZWwgQXJtYW5kIENhcnJlbMOJY29sZSBwcmltYWlyZcOJY29sZSDDqWzDqW1lbnRhaXJlIEN1cmlhbENvbGzDqGdlIE1hcmllIEN1cmllw4ljb2xlIG1hdGVybmVsbGUgTG91aXMgQmxhbmNEb3VibGUgQm9uaGV1csOJY29sZSBtYXRlcm5lbGxlIE1hcmNhZGV0w4ljb2xlIG1hdGVybmVsbGUgTWFyeCBEb3Jtb3nDiWNvbGUgw6lsw6ltZW50YWlyZSBkJ0F1YmVydmlsbGllcnNDZW50cmUgZOKAmUFuaW1hdGlvbiBMYSBHcmFuZ2UgYXV4IEJlbGxlc8OJY29sZSDDqWzDqW1lbnRhaXJlTGEgTG91dmVLVENTcXVhcmUgUmF5bW9uZC1RdWVuZWF1UGFyYWRpcyBkZSBTdXNoaVBhcmlzIExhIEdvdXR0ZS1kJ09yQW50ZW5uZSBKZXVuZXMgTW9udC1DZW5pc8OJY29sZSBwcml2w6llIFNhaW50LUxhdXJlbnRMYSBGYXlldHRlIC0gTWFnZW50YSAtIEdhcmUgZHUgTm9yZENvbnNlcnZhdG9pcmUgbXVuaWNpcGFsIGR1IFhJWGUgSmFjcXVlcyBJYmVydExlIENlbnRxdWF0cmUgLSAxMDRMYSBMaWJyZXJpYUNhcmR5w4ljb2xlIG1hdGVybmVsbGUgZXQgcHJpbWFpcmUgU2FpbnQtR2VvcmdlcyAocHJpdsOpKUxpYnJhaXJpZSBGaWR1Y2lhaXJlSGFsdGUtZ2FyZGVyaWVBbnRlbm5lIEpldW5lIEZsYW5kcmVzTcOpbcOpIGRhbnMgbGVzIE9ydGllc1NxdWFyZSBTaW1wbG9uTHljw6llIHByb2Zlc3Npb25uZWwgSGVjdG9yIEd1aW1hcmRHYXJlIGR1IE5vcmQgTm9jdGlsaWVuU3F1YXJlIFBhdWwgUm9iaW5TcXVhcmUgTWFkZWxlaW5lIFRyaWJvbGF0aUtpbmcgUGFyaXMgTW9iaWxlRm9vZCBIb3VzZUZyYW5rb2RlY2jDiWNvbGUgw6lsw6ltZW50YWlyZSBKZWFuLUZyYW7Dp29pcyBMw6lwaW5lUGl6emVyaWEgVG9kYSBMJ0FrZWxGcmFuc2kgU2hvcEJhbmFkaXIgQ2VudGVyIFBhcmlzQ29sbMOoZ2UgRWRtb25kIE1pY2hlbGV0QnVpIEJlYXV0w6nDiWNvbGUgcHJpbWFpcmUgSGVucmkgTm9ndcOocmVzTG9uZ3RlbXBzLi4uQ29pZmZ1cmUgU3R5bGVQYXJpcyBNb250aG9sb25DcsOoY2hlIGNvbGxlY3RpdmUgUGhpbGlwcGUgZGUgR2lyYXJkUHVibGlvdGjDqHF1ZUFsaXphIEFmcm9TcXVhcmUgZGUgQ2xpZ25hbmNvdXJ0U3F1YXJlIEV1Z8OobmUgVmFybGluSmFyZGluIFJhY2htYW5pbm92R29sZGVuIEZvb2TDiWNvbGUgw6lsw6ltZW50YWlyZSBSaWNob21tZUFsbG8gUmFwaWRvIFBpenphWXVwaGEgQmVhdXTDqSA5WmVicmEgU2hvZXNDaW1ldGnDqHJlIGRlcyBKdWlmcyBwb3J0dWdhaXNDcsOoY2hlIG11bmljaXBhbGUgQ2hhdW1vbnQgTGVwYWdlQ291cmlyQmlibGlvdGjDqHF1ZSBGcmFuw6dvaXMgVmlsbG9uU3F1YXJlIGRlIGxhIE1hZG9uZUxpYnJhaXJpZS1wcmVzc2VSYXdhc2kgdMOpbMOpY29tQ29sbMOoZ2UgVmFsbXlKYXJkaW4gQW1hZG91IEhhbXDDonTDqSBCw6LDiWNvbGUgbWF0ZXJuZWxsZSBQaWVycmUgQnVkaW7DiWNvbGUgw6lsw6ltZW50YWlyZSBBcXVlZHVjU3F1YXJlIEhlbnJpIENocmlzdGluw6lTaG9wSmFyZGluIEx1Yy1Ib2ZmbWFublNxdWFyZSBkZSBsJ8OJdmFuZ2lsZUNlbnRyZSBQYXJpcyBBbmltJyBDdXJpYWxQYXJpcyBCb2lub2RLaWxvdXRvdcOJY29sZSDDqWzDqW1lbnRhaXJlIEFybWFuZCBDYXJyZWxBIE9uZSBTaG9wTWF0b3PDiWNvbGUgcG9seXZhbGVudGUgw4ltaWxlIER1cGxvecOpR2FyZSBkdSBOb3JkIC0gRHVua2VycXVlTGUgUGFuYW1lQmFsYWRlcyBTb25vcmVzIFJlY29yZHPDiWNvbGUgw6lsw6ltZW50YWlyZSBQaWVycmUgQnVkaW5TcXVhcmUgZHUgUXVhaSBkZSBsYSBTZWluZVNxdWFyZSBDdXJpYWxMaWJyYWlyaWUgZHUgQ2FuYWxMYSBCYW5kZSBkZXMgQ2luw6lzTHljw6llIGfDqW7DqXJhbCBDb2xiZXJ0QWZyb2NsYXNzVGhpc2hhbiBTdXBlciBNYXJjaMOpRmx1eCBkJ2VuY3JlLiBDb21PJ1RhY29zUmFkaW8gTHlyZWxNb25vcCdMYSBSdWNoZSAtIMOJY29sZSBwcml2w6llIGRlcyBtw6l0aWVycyBkZSBsYSBjcsOpYXRpb25QYXBldGVyaWUgUGVyamFjVmVydCBkJ09KYXJkaW4gZGUgbCfDrmxvdCBSaXF1ZXRIdWJpesOJY29sZSDDqWzDqW1lbnRhaXJlIExvdWlzIEJsYW5jw4ljb2xlIFByaXbDqWUgU2FpbnQtQmVybmFyZCBkZSBsYSBDaGFwZWxsZUdsb2J1cyBTdGFyQWZybyBSdWJ5IENvc23DqXRpcXVlc1N1bmJ1cnlNYXJ0ZWwgQnJpY29sYWdlUGFyaXMgR2FyZSBkZSBsJ0VzdEJpYmxpb3Row6hxdWUgTWF1cmljZSBHZW5ldm9peFBob3RvIE9saXZlU2Fkw6lzaG9lc0dhcmUgZHUgTm9yZCAoZ2FyZSByb3V0acOocmUpR2FiIExpbmVMZSBSaWRlYXUgUm91Z2VPJ01vS2HDiWNvbGUgZHUgU29sZWlsQ29sbMOoZ2UgTWFyeCBEb3Jtb3lTcXVhcmUgTWFyY2VsIE1vdWxvdWRqacOJY29sZSDDqWzDqW1lbnRhaXJlIExhZmF5ZXR0ZVBhcmlzIE1ldWJsZXPDiXRvaWxl4oCLIExhZmF5ZXR0ZU9mZmljZSBEZXBvdFRTIFRlbGVjb21TQVJMIExlIERha2Fyb2lzR3JvdW5kIFplcm8sIE5hdGlvbmFsZSA3IFJlY29yZHNPcHRpYydBbGwgQXZlbnVlUG9saWNlIGRlcyBUcmFuc3BvcnRzQi5ELiBpbmZvcm1hdGlxdWVWSSBab25lRW1tYcO8c0NhbGkgTmFpbHNBdSBHcmVuaWVyIGR1IENoYW1wQ2FycmVmb3VyIEJpb0JpYmxpb3Row6hxdWUgQ2xhdWRlIEzDqXZpLVN0cmF1c3NMZSBCYXIgQ29tbXVuTGEgRmF5ZXR0ZSAtIFNhaW50LVF1ZW50aW4gLSBHYXJlIGR1IE5vcmRTcXVhcmUgU2FpbnQtQmVybmFyZCAtIFNhw69kIEJvdXppcmlMeWPDqWUgZ8OpbsOpcmFsIGV0IHRlY2hub2xvZ2lxdWUgamFjcXVhcmTDiWNvbGUgbWF0ZXJuZWxsZSBBcXVlZHVjw4ljb2xlIMOJbMOpbWVudGFpcmUgUHJpdsOpZSBMdWNpZW4gZGUgSGlyc2NoTsOpZ2F0aWYgKyBTZXJ2aWNlIGFyZ2VudGlxdWVBbWlyYWwgU3RvcmVSZWxheUNvdXJzIGRlcyBoYWxsZXPDiWNvbGUgbWF0ZXJuZWxsZSBldCDDqWzDqW1lbnRhaXJlIExvdWlzLUJsYW5jTU0gQWxpbWVudGF0aW9uTFNUQXV4IFJlbmRlei1Wb3VzIGRlcyBBbWlzTWFkZWVoYSAtIEJlYXV0w6kgZCdBZnJpcXVlS2lvc3F1ZSBkZSBQYXJpc0xlIE1lcmxlIE1vcXVldXJTcXVhcmUgTMOpb27DiWNvbGUgSW50ZXJuYXRpb25hbGUgQWxnw6lyaWVubmVTUksgRXhvdGlxdWVBIG9uZSBwcmludGVyc01haXNvbiBkJ0Vubm91ck1haXNvbiBkZSBsYSB2aWUgYXNzb2NpYXRpdmUgZXQgY2l0b3llbm5lIGR1IDEwZSBhcnJvbmRpc3NlbWVudFJNIGFsaW1lbnRhdGlvbiBnw6luw6lyYWxlRXhvIFN5bXBhTGUgTG9jYWxTdXBlcm1hcmNow6kgQXNpZSAtIEV4b0xpbGlhbmUgZGUgTWF0b3NCb2lzIERvcm1veUFDIG1hdGnDqHJlQmFyLVRhYmFjIExlIEJlcmdlcmFjRWRlbiBwaG9uZURpc2NvdW50IE1vYmlsZVNxdWFyZSBBbGFpbiBCYXNodW5nTHljw6llIEFsYmVydCBKYWNxdWFyZFNlcnZpY2UgZCdJbnZlc3RpZ2F0aW9uIFRyYW5zdmVyc2FsZVVuaXZlcnMgTGluZVl2ZXMgUm9jaGVyIFBhcmlzIEZsYW5kcmVUaGF2ZSBFeG9CLXZyYWNPcHRpYyBFeHBlcnTDiWNvbGUgw6lsw6ltZW50YWlyZSBDaGFicm9sQ29uc2VpbCBkZSBwcnVkJ2hvbW1lcyBkZSBQYXJpc1BvaW50IFNBdGVsaWVyIEZsb3JhbEdhbWJheE1haXNvbiBEb2R1IERpbmRvblBhcmlzIE9yZ3VlcyBkZSBGbGFuZHJlU04gU3ViYXRlbEVzcGFjZSBDaMOidGVhdSBMYW5kb25MaWJyYWlyaWUgQmF6YXLDiWNvbGUgRWxlbWVudGFpcmUgU2ltb24gQm9saXZhclRyYW5zZmx1eENhcnLDqSBWb3lhZ2VNYXJpb25uYXVkQW1hemluZyBCZWF1dHlDcsOoY2hlTWFtYSBDYWtlRmxldXJzIGRlIEZyYW5jZU9yaWVudGFsIERpc2NvdW50TGUgUGV0aXQgTWFyY2jDqUZhY2UgYSBGYWNlRnJhbmNlIENvbW9yZXMgVm95YWdlc8OJY29sZSBtYXRlcm5lbGxlIENhcnJlbEUuIExlY2xlcmMgUmVsYWlzQkFUVCBDT09QRWxlY3RybyBBZmZhaXJlc01hcmNow6kgRnJhbnByaXhFY29kYWlyIFBhcmlzQmlibGlvdGjDqHF1ZSBIZXJnw6lUaWVuZGEgRXNxdWlwdWxhc0lHQiBUw6lsw6ljb21FbW1hw7xzIGJvdXRpcXVlIHNvbGlkYWlyZUJsYWNrQm94ZUNvbGzDqGdlIEJlcm5hcmQgUGFsaXNzeVN1cGVyIE1hcmtldExlIEJsYW5jb0xhIFLDqWd1bGnDqHJlTGUgS2lvc3F1ZSBkZSBQYXJpc01hw69kYSBCZWF1dHlMJ8OJcGljZXJpZSBkdSAxMDREYW55IENhc2jDiWNvbGUgbWF0ZXJuZWxsZSBMw6lvbiBTY2h3YXJ0emVuYmVyZ1JlcHJvZ3JhcGhpZSBMZXMgSW1hZ2VzIE51bcOpcmlxdWVzw4ljb2xlIG1hdGVybmVsbGUgU2FkaSBMZWNvaW50ZUxpc3NhYyBPcHRpY2llbkF0ZWxpZXIgU29saUN5Y2xlUHJpbmNlIEpvcmdlR29sZE1pY3JvIGNyw6hjaGUgUGlyYXRlcyBkJ2VhdSBkb3VjZUwnSW52aXQnIMOgLWxpcmVTdXBlcmV0dGVMaWJyYWlyaWUgSXNsYW1pcXVlTHljw6llIHBvbHl2YWxlbnQgbCdJbml0aWF0aXZlTGlicmFpcmllIE11c2ljYWxlU2VydmljZXMgJiBUaWNrZXRzIFJBVFAgKEJhcmLDqHMgLSBSb2NoZWNob3VhcnQpR3VpY2hldCBUcmFuc2lsaWVuUnVlIGRlcyBQb2lzc29ubmllcnNDRiBpbmZvcm1hdGlxdWVDYXJyZWZvdXIgQ2l0eSBQYXJpcyBSaXF1ZXTDiWNvbGUgw4lsw6ltZW50YWlyZSBCZWx6dW5jZVBhcGV0ZXJpZSBNZXJjZXJpZSBKb3VybmF1eFBhcmlzIEluZm9ybWF0aXF1ZUJpam91IEpvY2VseW5lQmlvY29vcCBDYW5hbCBCaW9Fc3BhY2UgSmV1bmVzIEdvdXR0ZSBEJ09yTW9uIGNvbmNlcHQgaGFiaXRhdGlvbkxlcyBNYWxpY2lldXggZGUgTGFmYXlldHRlQ29sY2hpZGVGcmFuY2UgNEcgVMOpbMOpY29tS2lvc3F1ZSBKZXVuZXMgLSBMYSBHb3V0dGUgZCdPckhhdmFzIFZveWFnZXNBbWVyaWNhbiBDb3Ntw6l0aXF1ZXNNYXJjaMOpIENyaW3DqWUtQ3VyaWFsVmluZ3Rla2hvbmdMaXRvdGUgZW4gVMOqdGVDaXTDqSBTY29sYWlyZSBIZW5yaSBCZXJnc29uIC0gSmFjcXVhcmRBbGltZW50YXRpb24gR8OpbsOpcmFsZUNhcnJlZm91ciBNYXJrZXQgUGFyaXMgT3JuYW5vWmFyYVNPUyBNb2JpbGUgUG9pbnRMaWJyYWlyaWVPcmNoaWTDqWUgVGhhaSBCZWF1dMOpQ3VsdHVyZSBldCBMaWJlcnTDqU1haXNvbiBkZXMgQXNzb2NpYXRpb25zIGR1IFhJWGVGcnVpdHMgZXQgTMOpZ3VtZXNNYXJjaMOpIE9ybmFub0dhbGVyaWVzIGR1IE1vYmlsaWVyU29sZWlsTGVzIFjDqXJvZ3JhcGhlcyDDqWRpdGlvbnNEZXMgZmxldXJzIGNoZXogc29pTGUgQmlzdHJvdCBkdSBOb3JkTGUgQm9uIENvaW5MZSBMdXTDqXRpYUNvbGzDqGdlIEJvc3N1ZXQgLSBOb3RyZS1EYW1lQ29tbWlzc2FyaWF0IENlbnRyYWwgZGUgUG9saWNlIGR1IDEwZU1vbm9wcml4RG91YmxlIEV4ZW1wbGFpcmVJbnRlcm1hcmNow6kgRXhwcmVzc0FmcmkgUGhvbmVTcXVhcmUgQWxiYW4gU2F0cmFnbmVTcXVhcmUgZGUgSmVzc2FpbnRTdXDDqXJldHRlIGRlIEJvdWNyeUJvdXRpcXVlIGZvciBUb21vcnJvd0NoZXogRm91Y2hlciBNw6hyZSAmIEZpbGxlQWRvbmlzIEZsZXVyc0xpZGxQYXJpcyBQaGlsaXBwZSBkZSBHaXJhcmRTdXBlcmV0dGUgTWFya2V0Q29tbWlzc2FyaWF0IGRlIGxhIEdvdXR0ZSBkJ09yU3RvcmUgTUsyTWFyaW4gZCdFYXUgRG91Y2VEaWdpdGFsIEluZm9ybWF0aXF1ZUxlYWRlciBQcmljZUJhemFyIEwnT2xpdmVGcsOocmVzLVBob25lcy5uZXRKYXJkaW4gaW50w6lyaWV1ciBTYWludC1MYXphcmVQYXJpcyBMb3VpcyBCbGFuY01hcnJha2VjaFNxdWFyZSBMb3Vpc2UgZGUgTWFyaWxsYWNEw6lwaWwgU29mdE9wdGlxdWUgVG9yY3lMaWJyYWlyaWUgVmlnbmV0dGVzTWFpc29uIEFncmViaVBhcGV0ZXJpZXMgU2lsbEdsb2JhbCBQTSBFeHByZXNzRiZBIFRlbGVjb21KYWhhbiBtaW5pIG1hcmtldFVOSSBzdXJnZWzDqUxlIGZvdXJuaWwgZCdBbmRyw6l6aWV1eEx5Y2Ftb2JpbGVQYXJpcyBNYXJ4IERvcm1veUxpYnJlIFNlcnZpY2UgZGUgbGEgR2FyZVNBUkwgU3JpIEV4b3RpcXVlSmFyZGluIGRlIGxhIENvdXIgZGUgbGEgRmVybWUgU2FpbnQtTGF6YXJlU1lLIEFmcm9Qw6lww6kgU2FudGFuYUxlcyBOb3V2ZWF1eCBSb2JpbnNvbkJvZHkgTWludXRlTGVzIEJ1dmV1cnMgZCdFbmNyZU15IEF1Y2hhbkJpYmxpb3Row6hxdWUgR291dHRlIGTigJlPckJDSU0gaW5mb3JtYXRpcXVlSmFyZGluIE1hcmllbGxlLUZyYW5jb2lDZWxsU2FpbnQtTWFjbG91QXV0cmUgVnVlUGFyaXMgSmF1csOoc0ltcHJpbWVyaWUgUG9seXByaW1GbmFjTWNEb25hbGQnc0xhIFTDqnRlIGRhbnMgbGUgRnJvbWFnZVJhYXNpIFRlbGVjb21QYXJpcyBUcmF2ZWxTb2Npw6l0w6kgR8OpbsOpcmFsZUNyb2l4LVJvdWdlTGFtYXp1bmFTaGF5YW4gQ3LDqnBlUm9zZSBSb3VnZSBSZWxheGF0aW9uT3B0aWMgMjAwME5vY8OpYUFsbMO0IFNhcmluYUxlYmFyYUxhdGlubyBQaXp6YU3DqWRpYXRow6hxdWUgRnJhbsOnb2lzZS1TYWdhbktpc3NvIFN1biBDYXNoIGFuZCBDYXJyeUVzcGFjZSBGbGV1cnNIdW16YSBCZWF1dMOpUml2b2xpIFRlbGVjb21CaWpvdXRlcmllIFNhaW50LU1hcnRpbk5hdHVyYWxpYSBNYXJ4IERvcm1veUJpam91dGVyaWUgSG9ybG9nZXJpZVBvaXNzb25uaWVycyAtIE5vcmRBbmV4b051bWJlciBPbmUgLSBQcm9kdWl0cyBBZnJpY2FpbnNBdGVsaWVyIExlamV1c25lS2lmYWtQcmVzdGlzc2ltb1NlYmJhaCBwcmltZXVyc1RydWRhaW5lIE9wdGlxdWVNYWdhc2luIGRlIGNoYXVzc3VyZXNQcmluY3kgQmVhdXR5IFBhbGFjZUZyZW5jaCBDcsOqcGVzU2VjcsOpdGFuIE3DqW5hZ2VyTW9oYW4gSmV3ZWxsZXJ5IE1hcnRDb3B5LVRvcFBvaXNzb25uaWVycyAtIENoYW1waW9ubmV0VmVybmF6b2JyZXMgR3JlY29QZXJjaW5nIFN0YWxpbmdyYWRQYXJpcyBTdGFyIEZvb2RBcmMgZW4gQ2llbEd1ZXJyaXNvbEtveWFrYSBNYXJrZXRLYXZlcnkgQ2FzaCAmIENhcnJ5RMOpcMO0dCBkZSBMYSBDaGFwZWxsZVlhdG9vIFBhcnRvb0xlcyDDqXRoaXF1ZXTDqXNTdXBlciBtYXJrZXRFeG8gTWFya2V0QWRhbmFQYXJpcyBTY29vdGVyaXNPcHRpY0NNIEV4b3RpcXVlQ2hpY2tlbiBTcG90Q2FjdHVzICYgTWFpc29uLUNhZG9FdmEgVHJhdmVsc0FsaW1lbnRhdGlvbiBnw6luw6lyYWxlU0FSTCBTYW1pYU1hemFsYXkgQ291dHVyZUxlcyBkw6lsaWNlcyBkZSBsYSBDaGFwZWxsZU9wdGknbWlzdGVFbHNhICYgSnVzdGluU1RSIEFsaW1lbnRhdGlvbiBHw6luw6lyYWxlS2FuZ2Z1IE1hc3NhZ2VSb3lhbCBLZWJhYkxhIEJhbHVzdHJhZGVPcHRpcXVlTGEgUHJvc3DDqXJpdMOpQ2hhdXNzZSBDb25mb3J0TGEgcGF1c2UgdHJhaXRldXJEdWMgQ2hyaXN0b3BoZUxlIENpZWwgZXN0IMOgIHRvdXQgbGUgTW9uZGVDYXByaWNlIFN0eWxlUm9uZC1Qb2ludCBkZSBsYSBDaGFwZWxsZVNlbGVjdG91clNleHkgU2hvcFNoYXRoYSBUaW1lRm9vZExhIEdyYXBwZSBkJ09yQXV4IFF1YXRyZSBTYWlzb25zTGVzIEFsaXplcyBPcHRpY2llbnNBbHRvJ1RhY29zQ2hleiBUb255R2lmaVZpamF5U3Vid2F5TGUgcGV0aXQgbWFyY2jDqSBkZSBSaXF1ZXRNYXJjaMOpIGRlIExhIENoYXBlbGxlUGFyaXMgQm91dGlxdWUgR2FyZSBkZSBsJ0VzdEF1IHBhcyBkZSBTYWludC1Mb3Vpc0NoZXogR2FzdG9uS2luZ01GIDIwMDBTQVJMIENpc3NlICYgRmlsc1JEQyBCaW8gTmEgQmlvTGUgQsOpbmluUGFuZGEgRmFzdCBGb29kUGhvbmUgQm91dGlxdWVDcmVwJ1dheVBhcmlzIENhc2ggYW5kIENhcnJ5TGEgUGxhdGVmb3JtZSBkdSBCw6J0aW1lbnQgY29tcGFjdEQ0IENvc23DqXRpcXVlQm9keScgTWludXRlUnVlIE9yZGVuZXJab25lIE1vYmlsZUJpbyBHw6luw6lyYXRpb25MJ2FwcGFydGVtZW50IEVtbWHDvHNIRkMzOCBnb3VybWV0U28nRmFzdFBoYXJtYWNpZSBkZSBsYSBDaGFwZWxsZVByb3h5SW5mb3JtYXRpcXVlIE1vYmlsZVNhYmFiYVdheCBKb2xpIEFmcmlxdWVHb29kYXlBZGVzIG1vdG9zVGVsZS1Qb3AtTXVzaWtHdWluw6llIFN0b3JlTGUgUMOpbGljYW5QYXJpcyBTdG9yZUxlIEZsYXNoQnJpY29sZXhDYWlzc2UgZCfDiXBhcmduZSBQYXJpcyBMYSBDaGFwZWxsZURpZGltIEtlYmFiUGFyaXMgQ2FuYXDDqXNDcmVwZW1lbidCb25PbGl2ZXMsIMOpcGljZXMsIGZydWl0cyBzZWNzLCBldGMuLi5KREMgQWZyaWNhIC0gTGUgR3JlbmllciBkJ0FmcmlxdWVSb3NhIEluc3RpdHV0TGEgVmllIENsYWlyZUFlbGlhIER1dHkgRnJlZUxlIFByb3ZlbmNpYWxBQkkgRXhvdGlxdWVOaW5hIE1ldWJsZXMgJiBEZWNvw4lsw6lnYW5jZSAmIFZvdXNSaXF1ZXQgRmFzaGlvbkxlIFN1cGVyY29pbk1pc3Npw6BCZWF1dMOpcyBkdSBNb25kZUJhZ2VsIENvcm5lckF1IFLDqWd1bGF0ZXVyS2hhbiBUZWxlY29tbXVuaWNhdGlvbk1vbiBQZXRpdCBJbnN0aXR1dEVzdCdhaXIgVm95YWdlc1N1biBNb29uIFRlbGVjb21Nb24nRHdpY2gnQWZnaGFuIE1hcmtldEhvJ3Mga2ZlTGEgTWVkaW5hTMOpb25waG90RGhha2EgSW5mb3JtYXRpcXVlUm9jayB0aGUgS2lsaW1TYWJiYWggT3JpZW50YWxlZm9yIE1hYyAmIFBDUGFkbWEgdGVsZWNvbUxhbmRvbiBEw6lsaWNlc0xlIENvc3RhIFJpY2FTYXZldXIgMTlQb2ludCBTb2xlaWxTb3VuZGFyIFRyYXZlbHNMYSBSb3NlIGRlIFBhcmlzRyZNIENoYXVzc3VyZXNPdWVkLVJoaW91QnJpY29yb3V4WcO8biBQcmltZXVyIMOpcGljZXJpZSBmaW5lWGluIEthaSBZdWVWRUdBIFNrYXRlc2hvcEV1cm9wIFBob25lUGl0YSBCdXNpbmVzcyBDZW50ZXJGcm91LUZyb3UgTWVyY2VyaWUgQ29udGVtcG9yYWluZcOJcGljZXJpZSBkdSBDb2luIC0gQWxpbWVudGF0aW9uIEfDqW7DqXJhbGVJbGFuaW8gTW9iaWxlQkggc2Nvb3RlckxlIEZvbnRlbm95TCdBZHJpYXRpcXVlUGFqb2wgLSBQbGFjZSBIZXJiZXJ0UG9tbScgcmVzdG9DZW50cmUgRGVuaSBIZXNrb01vZHN1cHJlbUJvYm90byBCb25kZWtvIEtpbWlhRWFyLVdlbGwgTGFiTCdBcnQgZGUgVm9pck5hb3VyaSBDaXR5UGFya2luZyBaZW5wYXJrIE1hcnggRG9ybW95VHLDqW1hTGVzIElubm9jZW50c0xhIFZpZWlsbGUgUGllQ2hhdXNzZWVzIEhhdXQgZGUgR2FtbWVTdW4gVHJhdmVsTG9naW4gSW5mb3JtYXRpcXVlUmVzdGF1cmFudCBCb2RydW1FZGVzc2FEb3JhIFBob25lIFNob3BTdGFsaW5ncmFkIFBpZXJjaW5nQ2VudHJlIHNwb3J0aWYgTWljaGVsaW5lIE9zdGVybWV5ZXJDaG9oYW4gVGVsZWNvbUdsb2JhbCBHU01QYXJhZGlzIGQnQWZyaXF1ZVbDqXTDqXJpbmFpcmUgQ3JpbcOpZUp1aWN5ICYgVGFzdHlLaWxvZ3JhbW1lTGUgVGl2YW91YW5lVHphcmFTIFMgQkQgQ2xhc3NpYyBLaGFkaWphICYgQnJvc0VycmFuY2VzRWwgTm9wYWxMZSBSYWxseWVBZ2VuY2UgZGUgdm95YWdlcyBIYW5uYSBUb3Vyc1NpbW9u4oCZcyBib3V0aXF1ZSBob3RlbETDqWNvcmFzb2xMYXZlcmllQWxwaGEgQmV0YSBQcmVzc2VMYSBjYXZlIMOgIGNpZ2FyZXNTRlJDcmltw6llIC0gT3VyY3FEZSBMJ0F1dHJlIEPDtHTDqSBkZSBsYSBCdXR0ZVNtYXJ0Q2FybGEgQmVhdXTDqUxhIFRyaW5jYW50ZUZvb2RpUmV0cm9tb3Rpb25KdW1ib1NtYXJ0IE11bHRpbWVkaWFNYW0nQXlva2FTb2Npw6l0w6kgQ2FwcmljZSBDb21lc3RpcXVlUmF5YW5HYWxlcmllIEJvaG8gQm9ow6htZUUuTGVjbGVyYyByZWxhaXNZYW1haGFNYWdhc2luIGQnQWNjZXNzb2lyZXMgcG91ciBUw6lsw6lwaG9uZXNNYW1hIEFmcmljYUZldWlsbGUgw6AgRmV1aWxsZUxhIENvcm5lIGRlIGzigJlBZmZyaXF1ZUF5bmdhcmFuIENlbnRlckwnQWJzdXJkZSBJbXBvc3R1cmVNaWMgTWFjTWVkaWNhIFZpc2lvblBIIE9wdGljQydlc3QgdG91dCB2dURhaWx5IFNob3BwaW5nIENhc2ggJiBDYXJyeUJlYXV0eSBRdWVlbjfDqG1lIGLigJlhcnRLZW56aWVMZSBSZXBhaXJlTmljb2xhc0dhbGVyaWUgV2VuZ2VQb2l2cm9uIFJvdWdlQWTDqXF1YXRCaWpvdXRlcmllIE9yIEZsYW5kcmVCcmFnYXJkRmxhbmRyZSBBbGltZW50YXRpb25BdSByZW5kZXotdm91cyBkZXMgY2hhdWZmZXVyc0NoZXogUGHDr0xlIFNpbXBsb25NYWdhc2luIGRlIFdheEphcmRpbiBhdXggNCBTYWlzb25zQWxpbWVudGF0aW9uIE1lZGl0ZXJyYWluZUwnQWZmYW3DqVNDUyBJbmZvcm1hdGlxdWVNYXJpb24gR3JhdVNBUkwgRGplbmVib3UgLSBBbGltZW50YXRpb24gR8OpbsOpcmFsZVRlYW0gUFNHIFN0cmVldCBBcnRCb3V5Z3VlcyBUZWxlY29tRXVybyBRdWluY2FpbGxlcmllT3JkZW5lciAtIFBvaXNzb25uaWVyc0NlbnRyZSBzcG9ydGlmIFRyaXN0YW4gVHphcmFMJ09jY2l0YW5lQmVhdXTDqSBEaXZpbmVQcm9tZXRvdXJNYWNoaWNhZG91VkdHYXJhZ2UgQXJjaGVyZWF1Uy5TLiBDYXNoIGFuZCBDYXJyeUjDtHRlbCBNZXJyeWxNb2luY2hlcnBhcmZ1bUxlIE1hcmNow6kgRXhvdGlxdWVMZSBKYXJkaW4gZGUgRGplbmFPcHRpJyBDbGFpcmVBbGFpbiBBZmZsZWxvdUxlcyBDZXJjbGVzIGRlIGxhIEZvcm1lQml6eidhcnRFdG9pbGUgVmVydGVCaWpvdXRlcmllICsgT3JTdGFyIEFmcm8gTG9va1RpbiBUaW5BbGltZW50YXRpb24gR8OpbsOpcmFsZSBQcm9kdWl0cyBBZnJpY2FpbnNCaW8gQycgQm9uWW9uZ0NhZsOpIENhY2jDqUplYW4tQ2xhdWRlIEJpZ3VpbmVTdGFydC1VcCBWb3lhZ2VzUGFyaXMgUHJpbWV1cnMgQ3LDqG1lcmllSXR6aWtBdSBGaWwgZHUgVmluUGFyaXNsYW5kSmFycmEgQ291dHVyZUwnRXNjYWxlTGUgQm9saXZhckNoZW5uYWlDxZN1ciBkZSBOYXR1cmVDaGV6IENsYXJhT3JhbmdlUGl6emEgRmxhdm9yTGUgTG9mdE1pY2hlbGFuZ2Vsb0TDqWNvdXZyaXIgUGFyaXNCQSBQYXJpc09wdGlxdWUgU2VjcmV0YW5QaGFybWFjaWUgZGUgbCdPdXJjcUZhbW91cyBQYXJpc0tpbmdzIFRyYXZlbHNMYSBIdWNoZSBOb3JtYW5kZUxlIER1bmhpbGxDb21wdG9pciBkdSBCYW5nYWxFeGlzTGF2ZXJpZSBNIEdTYXJsIE1hYXZheUlzdGFuYnVsIE9yaWVudGFsRzIwUGhhcm1hY2llIEV1cm9ww6llbm5lQ2hleiBMYWhvdXNzaW5lTGVzIGTDqWxpY2VzIGRlIFJvc2EgUGFya3NQaGFybWFjaWUgZHUgU3F1YXJlTmV3IFRoYWkgU2FuT2tyb3MgVHVuZGVKIFdlbGxWb3lhZ2VzIExhZmF5ZXR0ZUFsbG8gUGl6emFTdXDDqXJldHRlIEFmcmljYWluZVBvaXNzb24gZHUgTW9uZGVRdWF0cmUtVmluZ3QgRGV1eFTDqWzDqSBNw6luYWdlciBQYXJpc2llblRhbmdlciAtIFBsYWNlIGR1IE1hcm9jR2FzdG9uIFRlc3NpZXIgLSBSb3NhIFBhcmtzIFJFUlBoYXJtYWNpZSA3NUNvbmZvcnR1bWFCZWUnIFNob2Vzw4lsb2RpZUV1cm8gQmFuZ2xhIE11bHRpIFNlcnZpY2VzTGUgU2FpbnQtQmVub2l0RGVwYXJ0ZW1lbnQgLSBQYWpvbFBhcmFkaXNlIFBpenphTXlocmEgVHJvcGljYWxDaXR5IFZpc2lvbkxhIFBhbnRow6hyZSBPc2XDiXBpY2VyaWVBYmR1bGxhIEtleWFhbi5jb20gVGF4aXBob25lTGVzIGNvdWxldXJzIGQnw45sZSBkZSBGcmFuY2VOZWVsdW1TdGFyIENvbU1hbWFnYXlhSMO0dGVsIEliaXMgU3R5bGVzIFBhcmlzIENyaW3DqWUgTGEgVmlsbGV0dGVMYSBSb3NlcmFpZUNlbnRyZSBkZSBraW7DqXNpdGjDqXJhcGllIFJpcXVldEJyaWNrdG9wIFBpenphU2VudGV1ciBkZXMgVmllc05hdHVyYWxpYUxlIEphc21pbiBDYWbDqUxlIFBldGl0IENhcmlsbG9uRmFicmlxdWUgRGFpZ3JlbW9udEF1YmVyZ2UgZHUgQm9uaGV1ckNvdXJzIGRlcyBIYWxsZXNEw6lqw6AgVnVlUGF0aXN0b3JpQ2F0aHkgT25nbGVzQm91Y2hlcmllIE1lbmd1ZWxsZXRKYXJkaW5zIGQnRW9sZUthcnRoaWthIEludGVybmF0aW9uYWxLb2JhbCBDYXNoIGFuZCBDYXJyeUNow6J0ZWF1IE1hcnRpYWxDb3JuZWlsIDM2Qm91bGFuZ2VyaWUgRGUgQ3JpbcOpZU5hb21pZSBCZWF1dMOpWXZlcyBSb2NoZXJSZXN0YXVyYW50IExvY29tb3RpdmVMZSBSYXRhcG9pbCBkdSBGYXVib3VyZ1RhbmcgRnLDqHJlc0xhIENhc3Nlcm9sZUxSQiBNZWRpYXRlbGVjb21MdXhvcHRpY0xlIENow6J0ZWF1IExhbmRvblNoYWFlQ2hpY2tlbiBLaW5nQnJhc3NlcmllIEwnT2xpdmVOb3RhTGVzIEFuaW1hbHNEaWFieS1LYWJhUGhvbmUgMjAwMEF1IGRlbGEgZHUgUENDaGV6IEZvdWNoZXIgTcOocmUgZXQgRmlsbGUyMjVDYXNpbm9HdW1ibyBZYXlhSGFpciBGYXNoaW9uIFN0eWxlQmFucXVlIFBvcHVsYWlyZSBSaXZlcyBkZSBQYXJpc0Nhc2EgUm9tYU5haWxzIE1pbnV0ZUpvaG4gUGF1bEVhc3QgQnVua2VyTWFyY2jDqSBHb3VybyBkJ0FiaWRqYW7DgCAyIFBhc1Njb290ZXIgQ2VudGVyIFBhcmlzSMO0dGVsIGRlIEJlbGxldnVlIFBhcmlzw4lnbGlzZSBTYWludC1TYXZhQ0hJQ0ggS0VCQUJMJ2VzY2FsZSBwb3VyIGxhIFBhaXhMZSBEamVubmUgSUlCcmlnaHQgMTAgT3B0aXF1ZVNreSBQaG9uZVBoYXJtYWNpZSBDb2hlbiBTb2xhbENhcnJlZm91ciBNYXJrZXRBbGwgSW4gUGhvbmVDb2NjaW5lbGxlT3B0aWNhbCBTZXJ2aWNlIE8rQmVhdXR5IEdpcmxzSGFub3VtYW5QaGFybWFjaWUgVHVyZ290UC5ULlMuIFNBUkxSdWUgZGUgRmxhbmRyZSAoY2VudHJlIGNvbW1lcmNpYWwpS0lLTyBNaWxhbm9DZW50cmUgZGUgc2FudMOpIFBhcmlzIDE4w6htZUxlIFJvYmluZXQgZCdPckZveWVyIGQnw6l0dWRpYW50cyAtIENoZW1pbiBOZXVmTWFyaWUgRnJhbmNlIFByZXQgYSBwb3J0ZXJDR0VEIC0gY29tcHRvaXIgZCfDqWxlY3RyaWNpdMOpIFZhbG15R2FyYWdlIFBham9sQ2x1YiBSQVRQRWwgTXVuZG9BYmkgQmVhdXR5IFBhbGFjZUF1eCBTcG9ydHNXaWxsaWFtJ3MgT3BlcmFMZSBHcmFuZCBQYXJxdWV0UGV1Z2VvdCBQU0EgUmV0YWlsIFBhcmlzIEdhcmUgZGUgbCdFc3RBbnRhbHlhSmFyZGluIMOpcGjDqW3DqHJlIEJhdWRlbGlxdWVNYWdhc2luIGRlIFRpc3N1c1NlcGhvcmFTb3VsIEZvb2RLYWxpZW50ZURhcm91c2FsYW0gQ291dHVyZUjDtHRlbCBSaXF1ZXRIw7R0ZWwgUGFyaXMgVmlsbGV0dGVQw6hyZSAmIEZpc2hDaGV6IEFtbWFkUGhhcm1hY2llIExhYnJlbHlDYXNpbm8gU2hvcFBoYXJtYWNpZSBCYW5hTWFyY2hhbmRlcyBkZSBjb3VsZXVyc0ZyZXNoICYgRmFzdEdyaWxsIElzdGFuYnVsTGUgTmF2aWdhdGV1ck15IEJydXNoQm9iJ3MgQmFrZSBTaG9wQm91dGlxdWUgUkFUUExhIFJhbWVNb25vcOKAmURhaWx5QWlkYSBCZWF1dMOpw4lwaWNlcmllIGRlcyBFbnZpcm9uc0dhcmUgZGUgbCdFc3QgLSBWZXJkdW5TbmFjayAxMTZHcmFuZCBHYXJhZ2UgQ2xpZ25hbmNvdXJ0TGEgVmllIGVzdCBCZWxsZUJWIENvbmdvIEV4b3RpcXVlUGlzY2luZSBkZXMgQW1pcmF1eER5bmFtb0wnYXZlbnR1cmUgw6AgVsOpbG9TYWxvbiBDaGFudGFsTWV1YmxlcyBQYXNjYWxUYWJhY0ZseW5hc0Jpc3Ryb3QgUGFwaWxsb25MYSBCYWd1ZXR0ZUTDqWxpY2VzIGRlIEZsYW5kcmVGcmFuY2UgQmFuZ2xhTGEgQ2FudGluYUxlIE1hdGhpc1BhcmlzIE5vcmQgR1NNTydSb3lhbENhaXNzZSBkJ8OJcGFyZ25lIFBhcmlzIE9yZGVuZXIgTWFpcmllQnJpY28gTWV1Ymxlc08nVnJhYyBkJ0Ftw6lsaWVDb3B5IFByZXNzw4lnbGlzZSBTYWludC1EZW55cyBkZSBsYSBDaGFwZWxsZU1hbGFMYSBNYWlzb24gQmxldWVUYXNza2FHYXJlIGRlIGwnRXN0IC0gQ2jDonRlYXUtTGFuZG9uSGFkaSBDb2lmZnVyZUxlIE5hcnZhbFNBUkwgTWFkaWJhQXV0b3VyIGR1IEZvdXJuaWxNdWx0aW1lZGlhIFNlcnZpY2VzSMO0dGVsIFRvcmN5TWFra2FsIEthZGFpUmVzaWRob21lIFBhcmlzIFJvc2EgUGFya3NIw7R0ZWwgZHUgVGVycmFnZVBvaW50IFBMZSBOZW1yb2RBa2Rlbml6UGl6emEgVGltZVZpZ25lc0xlIFBldGl0IEpvc2VwaEJyYXNzZXJpZSBMZSBDb3JhaWxKYW5ldCAtIENvbGxlY3Rpb25UcmlvIEFmcmljYUFydExhYlBpenphTlNQIHNhcmxDb3V0dXJlIE1vZGUgZXQgQ3JlYXRpb25QJkwgVHJlc3Nlc1F1ZWxsaSBkaSBsYVBpc2NpbmUgSMOpYmVydFRhc3Nha2FTaXJhc2EgRW50cmVwcmlzZUdyYW5kIHN1ZENJQ09wdGljJyBhbGwgQXZlbnVlU3BhIE5pbmdqaW5nIFNhbG9uIGRlIG1hc3NhZ2VQcmVzc2luZyBMeXNtdXNEb21pbm8ncyBQaXp6YVN1ZXogQmF6YXJTdHJlZXQgQmFuZ2tvayBMb2NhbCBGb29kUmVzdGF1cmFudCBpbmRpZW4gJiBDcsOqcGVyaWVNZW1vQ290IENvdExhIFRlcnJhc3NlUsOpc2lkZW5jZSBSb215IFNjaG5laWRlckF1ZGlrYUF1IE3DqWRpdGVycmFuw6llbkhvcml6b24gVW5pQmFzaWxpcXVlIFNhaW50ZS1KZWFubmUtZOKAmUFyY01vdWphaGlyIFRyYXZlbHNMZSBwYXZpbGxvbiBhdXggZmxldXJzTGUgVmljcSBkJ0F6aXJMZXMgRMOpbGljZXMgZGVzIEZhdWJvdXJnc1BhcmZ1bWVyaWUgQnVyZGluVGFjb1NoYWtlTWFyeCBleG90aXF1ZVp1YmVpZGEgQ29zbcOpdGlxdWVzTGUgQ29tbWVyY2VQb2xhciBNYXRlcmlhdXhDYWbDqSBDYWNhaHXDqHRlw4lnbGlzZSBTYWludC1MdWNFdXJvcGUgS2ViYXBNYW5kZWVxTGVzIEZvbmR1cyBkZSBsYSBSYWNsZXR0ZVBoYXJtYWNpZSBkdSBTbXBsb25CdXJnZXIgS2luZ1BhcmtpbmcgUGFyaXMgMTlLaW1zb3VCZWxsZXZpbGxlUmFvdWwgRm9sbGVyZWF1TGV6J0FydHNQbGFjZSBkdSBDb2xvbmVsIEZhYmllblByaW50IEV4cHJlc3NQaGFybWFjaWUgSG9tw6lvcGF0aXF1ZSBNYXViZXVnZUxlIFBhY3RvbGVCZWF1dMOpIFVuaXF1ZUZvcnVtIGQnQWRqYW3DqVBob25lRXh0YXNpYU55c2FIw7R0ZWwgQmVsZm9ydFBob25lIEhvdXNlQ2hleiBMYWxsYUNvcGllIExhIENoYXBlbGxlQWdlbmNlIE15cmlhbSB2b3lhZ2VzU2FtIEtlYmFiQ2FyaWVsTGUgVmVsbGVmYXV4TGEgQmVsbGUgTWV1bmnDqHJlR3JhbWVlbiBCZW5nbGFMJ8OJY29sZSBCdWlzc29ubmnDqHJlTGUgQ2hhbnNvbm5pZXLDiWdsaXNlIE5vdHJlLURhbWUgZHUgQm9uIENvbnNlaWxEaWFtIEludGVybmF0aW9uYWwgLSBNZXJjZXJpZSBHw6luw6lyYWxlWWFsb3VuYSBCb3V0aXF1ZUxhIFJvdG9uZGUgSMOpYmVydGluZVJlc3RhdXJhbnQgUGFjaGFBdSBCb250ZW1wc0FmcmlrYSBCb2JvdG9MZXMgRm91cm5pbHMgZGUgRnJhbmNlUy5QLiBSYWp1V2FzaCduIGRyeUxlIFBoZW5peCBkJ09yUGhhcm1hY2llIENvbG9uZWwgRmFiaWVuTGUgVmVycmUgVGFxdWluRXF1aXZhbGVuemFCaWpvdXRlcmllIE5vYWhNb2RlIFBsdXNDYWbDqSBkZSBsYSBHYXJlUGFya2luZyBaZW5wYXJrIFBvcnRlIGTigJlBdWJlcnZpbGxpZXJzWWF0YWxpZVJveWFsIFJvY2hlIENob3VhcnRIUyBNdWx0aSBTZXJ2aWNlc1Byw6lmw6lyZW5jZSBDb3Ntw6l0aXF1ZVNxdWFyZSBNYXVyaWNlLUtyaWVnZWwtVmFscmltb250Qm91bGFuZ2VyaWUgVmVydGVGYWl6YSBCZWF1dHlMJ8OJY2xhdCBkZXMgTWFpbnNQaGFybWFjaWUgU291c3Nhbi1BaXplbm1hbkxlIENoYWxhbmRFeG90aXF1ZSBMS04gQWZyaWNhQW5na29yUGhhcm1hY2llIGR1IE1hcmNow6lMYSBHYXJlbnRpdGEtVHdvU0FSTCBBaXIgU3VuTWlzcyBMaXF1ZU9wdGljaWVuIE5lc3NBc2lhIFBhY2lmaWMgVHJhZGVIw7R0ZWwgTGUgQmllbnZlbnVlT2hhbGV5IFlhYWtvdkZseSBDb21tdW5pY2F0aW9uQm91Y2hlcmllIFN1cGVybWFya2V0IEhhw690acOJdG9pbGUgZCdBZnJpcXVlIFZveWFnZXNSdWUgZGUgQ2hhYnJvbE15cmlhbSBDb2lmZnVyZU1heXNhcmEgSW5zdGl0dXRUZW5uaXMgZGUgdGFibGVCb3VjaGVyaWUgR291cmF5YUphcmRpbiBwYXJ0YWfDqSBkdSBUcsOoZmxlIGQnw4lvbGVEw6lsaWNlIFBhaW5MYSBQcmluY2lwZXNzZUVsZWN0cmFBc2lhIE1hcmtldEF1IEJvbmhldXIgZGVzIG1hcmnDqXNPcHRpY2FsIERpc2NvdW50QWxwaGEgQnJpY28gU2VydmljZXNMYSBNYXJtaXRlTGUgQ2Fmw6kgUHJ1ZCdoT3V0bGV0IENyaW3DqWVTdXNoaSBDcmltw6llU2Fsb24gZGUgbWFzc2FnZSB0aGFpbGFuZGFpcyBKaWEgSmlhUnVlIExhIEZheWV0dGVIb3Jsb2dlckxlIFJpZGVhdSBkZSBGZXJGdWxhbm9IZWxsYSBNYXJpYWdlR8OpbsOpcmFsZSBkJ09wdGlxdWVDYW5hbCBTdXNoaUxhcyBDaGljYXNGYXVib3VyZyBQb2lzc29ubmnDqHJlSMO0dGVsIFZpY3EgZCdBemlyTCdBbWJhc3NhZGVHU00gV2FsbGV0QmFsYXZpbnlhZ2FyTENMQm91Y2hlcmllIEFsIEFtYW5hTGEgSGFsbGVQQyBEaWFnbm9zdGljTGEgTWFpc29uIFRoYcOvTWVnYXdheFRhdGlFY29sb2dpZSAyMDAwQ2hvdSBDb20gVG91dFRoYcOvIDE4TUFBIFRlbGVjb21MJ1VuaXZlcnMgZGUgTMOpb1RvdGFsw4lwaWNlcmllIEFmcmljYWluZUxlcyBGcmFuZ2luc0xhdmVyaWUgU0JTQXUgVGFxdWV0VHJpYW5nbGUgZCdvclRow6nDonRyZSBQaXhlbEFsZXhpc0dvcGFsIGFuZCBDbyBTdXBlcm1hcmNow6lEb3BwaW9KdSBZb3VCYXJyYWN1ZGFMYSBDb3Vwb2xlS2hhbHNhIFRleHRpbGVFY2xhdCBCZWF1dMOpUGl6emEgTmlub0FnZW5jZSBUcmFuc2lsaWVuQ2hleiBDeXJpbGxlRm9udGFpbmUgZGUgQmVsbGV2aWxsZU0uQ09NTWFya3MgYW5kIFNwZW5jZXIgRm9vZEF1IFJlbmRlei12b3VzIGR1IE1hcmlhZ2VMZSBUcmljeWNsZUZhbGllRm9udGFpbmUgV2FsbGFjZVNyaSBNYWhhbFJlc3RhdXJhbnQgTWFuZGFyaW4gZHUgTWFyY2jDqUxlIE11cmdlckjDtHRlbCBDcmltw6llSmlhbHknc1BhcmFkaXNlIFRyYXZlbHNPJ1BhcmNMZSBDb2xiZXJ0Q2VudHJlIEhwIDI1IFJldm9sdXRpb25TQVJMIERlYm9SYWptYWhhbEjDtHRlbCBkdSBQcsOpUHJlc3NpbmdsJ1VuaXZlcnMgZGUgTMOpb0jDtHRlbCBkZXMgT2x5bXBpYWRlc0JhYyDDoCBzYWJsZVDDonRpc3NlcmllIGRlcyBTdWx0YW5zS2lkcyBNYWpvck9wdGlxdWUgR3VlekTDqWNvcmF0aW9uIG1hdMOpcmlhdXggZGUgRmxhbmRyZUFmcm8tc29pbnNDcsOpZGl0IGR1IE5vcmRib3VpLWJvdWlHZW5lcmF0b3IgSG9zdGVsc0FiZG91bG1hamlkTW9ub3AnRGFpbHlTbydGb29kc1ZhbGVnZUJvdXRpcXVlIEdyYW5kZXMgTGlnbmVzaWJpcyBQYXJpcyBDYW5hbCBTYWludCBNYXJ0aW5FdmFuZ2lsZSAtIEF1YmVydmlsbGllcnNMYSBQZXJnb2xhIGQnSXRhbGlhSmFyZGluIHBhcnRhZ8OpIGRlIGxhIGJ1dHRlIEJlcmdleXJlRUxNIEluZm9ybWF0aXF1ZUFtYmFhbFN1bnNoaW5lTGEgUGFpbGxhc3NlRmllc3RhIMOoIGJhc3RhUMOpZGljdXJlRW1tYcO8cyBEw6lmaVIuQy5BIE11bHRpIFJ2aWNlc0dhbyBsaSBzYWxvbiBkZSBtYXNzYWdlTCdFdGVybmVlbFRoZSBOZXcgTG9vayBGYXNoaW9uVW4gQW1vdXIgZGUgZmxldXJEcmFmdCBBdGVsaWVyc1LDqXNpZGVuY2UgZHUgUHLDqVBhbmRhIE1hcmlhZ2VMZXMgUHJpbWV1cnMgZHUgQ2jDonRlYXVCbGFuY2hpc3NlcmllIGNvdXR1cmUgU2VjcsOpdGFuU2FiYmFoU2hhbWl0aGFOZXNzRmFzYWwgQ29pZmZ1cmVNYWlzb24gQ2");
  private static final SymbolTable LARGE_ENCODED = JAVA.encode(LARGE);
  // 230kb
  private static final byte[] XLARGE;
  private static final SymbolTable XLARGE_ENCODED;

  static {
    XLARGE = new byte[LARGE.length * 10];
    for (int i = 0; i < 10; i++) {
      System.arraycopy(LARGE, 0, XLARGE, i * LARGE.length, LARGE.length);
    }
    XLARGE_ENCODED = JAVA.encode(XLARGE);
  }

  @Benchmark
  public SymbolTable encodeSmallJava() {
    return JAVA.encode(SMALL);
  }

  @Benchmark
  public SymbolTable encodeMediumJava() {
    return JAVA.encode(MEDIUM);
  }

  @Benchmark
  public SymbolTable encodeLargeJava() {
    return JAVA.encode(LARGE);
  }

  @Benchmark
  public SymbolTable encodeExtraLargeJava() {
    return JAVA.encode(XLARGE);
  }

  @Benchmark
  public SymbolTable encodeSmallJni() {
    return JNI.encode(SMALL);
  }

  @Benchmark
  public SymbolTable encodeMediumJni() {
    return JNI.encode(MEDIUM);
  }

  @Benchmark
  public SymbolTable encodeLargeJni() {
    return JNI.encode(LARGE);
  }

  @Benchmark
  public SymbolTable encodeExtraLargeJni() {
    return JNI.encode(XLARGE);
  }

  @Benchmark
  public byte[] decodeSmallJava() {
    return JAVA.decode(SMALL_ENCODED);
  }

  @Benchmark
  public byte[] decodeMediumJava() {
    return JAVA.decode(MEDIUM_ENCODED);
  }

  @Benchmark
  public byte[] decodeLargeJava() {
    return JAVA.decode(LARGE_ENCODED);
  }

  @Benchmark
  public byte[] decodeExtraLargeJava() {
    return JAVA.decode(XLARGE_ENCODED);
  }
}
